function pagerFilter(data) {
    if ($.isArray(data)) {    // is array
        data = {
            total: data.length,
            rows: data
        }
    }
    var target = this;
    var dg = $(target);
    var state = dg.data('datagrid');
    var opts = dg.datagrid('options');
    if (!state.allRows) {
        state.allRows = (data.rows);
    }
    if (!opts.remoteSort && opts.sortName) {
        var names = opts.sortName.split(',');
        var orders = opts.sortOrder.split(',');
        state.allRows.sort(function (r1, r2) {
            var r = 0;
            for (var i = 0; i < names.length; i++) {
                var sn = names[i];
                var so = orders[i];
                var col = $(target).datagrid('getColumnOption', sn);
                var sortFunc = col.sorter || function (a, b) {
                    return a == b ? 0 : (a > b ? 1 : -1);
                };
                r = sortFunc(r1[sn], r2[sn]) * (so == 'asc' ? 1 : -1);
                if (r != 0) {
                    return r;
                }
            }
            return r;
        });
    }
    var start = (opts.pageNumber - 1) * parseInt(opts.pageSize);
    var end = start + parseInt(opts.pageSize);
    data.rows = state.allRows.slice(start, end);
    return data;
}

var loadDataMethod = loadDataMethod || $.fn.datagrid.methods.loadData;
var deleteRowMethod = loadDataMethod || $.fn.datagrid.methods.deleteRow;
$.extend($.fn.datagrid.methods, {
    clientPaging: function (jq) {
        return jq.each(function () {
            var dg = $(this);
            var state = dg.data('datagrid');
            var opts = state.options;
            opts.loadFilter = pagerFilter;
            var onBeforeLoad = opts.onBeforeLoad;
            opts.onBeforeLoad = function (param) {
                state.allRows = null;
                return onBeforeLoad.call(this, param);
            }
            var pager = dg.datagrid('getPager');
            pager.pagination({
                onSelectPage: function (pageNum, pageSize) {
                    opts.pageNumber = pageNum;
                    opts.pageSize = pageSize;
                    pager.pagination('refresh', {
                        pageNumber: pageNum,
                        pageSize: pageSize
                    });
                    dg.datagrid('loadData', state.allRows);
                }
            });
            $(this).datagrid('loadData', state.data);
            if (opts.url) {
                $(this).datagrid('reload');
            }
        });
    },
    loadData: function (jq, data) {
        jq.each(function () {
            $(this).data('datagrid').allRows = null;
        });
        return loadDataMethod.call($.fn.datagrid.methods, jq, data);
    },
    deleteRow: function (jq, index) {
        return jq.each(function () {
            var row = $(this).datagrid('getRows')[index];
            deleteRowMethod.call($.fn.datagrid.methods, $(this), index);
            var state = $(this).data('datagrid');
            if (state.options.loadFilter == pagerFilter) {
                for (var i = 0; i < state.allRows.length; i++) {
                    if (state.allRows[i] == row) {
                        state.allRows.splice(i, 1);
                        break;
                    }
                }
                $(this).datagrid('loadData', state.allRows);
            }
        });
    },
    getAllRows: function (jq) {
        return jq.data('datagrid').allRows;
    }
});
